This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(tidyverse)
  1. Using the read_csv() function, read the GDP dataset into your notebook as a tibble called gdp_df. After reading it in, inspect the first 10 rows and then inspect the last 10 rows.

gdp_df <- read_csv("../data/gdp_per_capita.csv")

head(gdp_df, 10)
NA
tail(gdp_df, 10)
  1. Drop the ‘Value Footnotes’ column, and rename the remaining columns to ‘Country’, ‘Year’, and ‘GDP_Per_Capita’.

gdp_df_drop <- gdp_df |> 
  select(-`Value Footnotes`)


gdp_df_drop
NA

gdp_df_drop_rename <- gdp_df_drop |> 
  rename(c(GDP_Per_Capita = Value, Country = `Country or Area`))

gdp_df_drop_rename
  1. Which years are represented in this dataset? How many observations are there per year? Make a plot to view the number of observations per year.
min(gdp_df_drop_rename[,2])
[1] 1990
max(gdp_df_drop_rename[,2])
[1] 2022

How many observations are there per year?

no_obsv_year <- gdp_df_drop_rename |> 
  count(Year)
no_obsv_year

Make a plot to view the number of observations per year.

no_obsv_year |> 
  ggplot(aes(x = Year, y = n)) + 
    geom_col()

  1. How many countries are represented in this dataset? Which countries have the fewest observations?

no_obsv_ctry <- gdp_df_drop_rename |> 
  count(Country)
no_obsv_ctry
NA

gdp_df_drop_rename |> 
  distinct(Country[!is.na(Country)])

gdp_df_drop_rename |> 
  distinct(Country)
NA

length(unique(gdp_df_drop_rename$Country))
[1] 242

Which countries have the fewest observations?


min(no_obsv_ctry$n)
[1] 10
no_obsv_ctry |> 
  mutate(freq = min(n))
NA

tail(sort(no_obsv_ctry$Country), 3)
[1] "World"    "Zambia"   "Zimbabwe"

with(unique(no_obsv_ctry[c("Country", "n")]), table(no_obsv_ctry))
                                                    n
Country                                              10 12 14 15 16 19 20 22 23 24 25 26 28 29 30 31 32 33
  Afghanistan                                         0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0
  Africa Eastern and Southern                         0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Africa Western and Central                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Albania                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Algeria                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Angola                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Antigua and Barbuda                                 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Arab World                                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Argentina                                           0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Armenia                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Aruba                                               0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0
  Australia                                           0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Austria                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Azerbaijan                                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bahrain                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bangladesh                                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Barbados                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Belarus                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Belgium                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Belize                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Benin                                               0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bermuda                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bhutan                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0
  Bolivia                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bosnia and Herzegovina                              0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0
  Botswana                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Brazil                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Brunei                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Bulgaria                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Burkina Faso                                        0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Burundi                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Côte d'Ivoire                                      0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Cabo Verde                                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Cambodia                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0
  Cameroon                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Canada                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Caribbean small states                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Cayman Islands                                      0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0
  Central African Republic                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Central Europe and the Baltics                      0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Chad                                                0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Chile                                               0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  China                                               0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Colombia                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Comoros                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Congo                                               0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Costa Rica                                          0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Croatia                                             0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0
  Curaçao                                            0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0
  Cyprus                                              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Czechia                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Dem. Rep. Congo                                     0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Denmark                                             0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
  Djibouti                                            1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  Dominica                                            0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
 [ reached 'max' / getOption("max.print") -- omitted 187 rows ]
table(gdp_df_drop_rename$Country)

                                       Afghanistan                        Africa Eastern and Southern                         Africa Western and Central 
                                                20                                                 33                                                 33 
                                           Albania                                            Algeria                                             Angola 
                                                33                                                 33                                                 33 
                               Antigua and Barbuda                                         Arab World                                          Argentina 
                                                33                                                 33                                                 33 
                                           Armenia                                              Aruba                                          Australia 
                                                33                                                 32                                                 33 
                                           Austria                                         Azerbaijan                                            Bahrain 
                                                33                                                 33                                                 33 
                                        Bangladesh                                           Barbados                                            Belarus 
                                                33                                                 33                                                 33 
                                           Belgium                                             Belize                                              Benin 
                                                33                                                 33                                                 33 
                                           Bermuda                                             Bhutan                                            Bolivia 
                                                33                                                 32                                                 33 
                            Bosnia and Herzegovina                                           Botswana                                             Brazil 
                                                29                                                 33                                                 33 
                                            Brunei                                           Bulgaria                                       Burkina Faso 
                                                33                                                 33                                                 33 
                                           Burundi                                     Côte d'Ivoire                                         Cabo Verde 
                                                33                                                 33                                                 33 
                                          Cambodia                                           Cameroon                                             Canada 
                                                30                                                 33                                                 33 
                            Caribbean small states                                     Cayman Islands                           Central African Republic 
                                                33                                                 16                                                 33 
                    Central Europe and the Baltics                                               Chad                                              Chile 
                                                33                                                 33                                                 33 
                                             China                                           Colombia                                            Comoros 
                                                33                                                 33                                                 33 
                                             Congo                                         Costa Rica                                            Croatia 
                                                33                                                 33                                                 28 
                                          Curaçao                                             Cyprus                                            Czechia 
                                                22                                                 33                                                 33 
                                   Dem. Rep. Congo                                            Denmark                                           Djibouti 
                                                33                                                 33                                                 10 
                                          Dominica                                 Dominican Republic                         Early-demographic dividend 
                                                33                                                 33                                                 33 
                               East Asia & Pacific        East Asia & Pacific (excluding high income)                   East Asia & Pacific (IDA & IBRD) 
                                                33                                                 33                                                 33 
                                           Ecuador                                              Egypt                                        El Salvador 
                                                33                                                 33                                                 33 
                                 Equatorial Guinea                                            Estonia                                           Eswatini 
                                                33                                                 28                                                 33 
                                          Ethiopia                                          Euro area                              Europe & Central Asia 
                                                33                                                 33                                                 33 
     Europe & Central Asia (excluding high income)                 Europe & Central Asia (IDA & IBRD)                                     European Union 
                                                33                                                 33                                                 33 
                                              Fiji                                            Finland           Fragile and conflict affected situations 
                                                33                                                 33                                                 33 
                                            France                                              Gabon                                            Georgia 
                                                33                                                 33                                                 33 
                                           Germany                                              Ghana                                             Greece 
                                                33                                                 33                                                 33 
                                           Grenada                                          Guatemala                                             Guinea 
                                                33                                                 33                                                 33 
                                     Guinea-Bissau                                             Guyana                                              Haiti 
                                                33                                                 33                                                 33 
            Heavily indebted poor countries (HIPC)                                        High income                                           Honduras 
                                                33                                                 33                                                 33 
                              Hong Kong SAR, China                                            Hungary                                          IBRD only 
                                                33                                                 32                                                 33 
                                           Iceland                                   IDA & IBRD total                                          IDA blend 
                                                28                                                 33                                                 33 
                                          IDA only                                          IDA total                                              India 
                                                33                                                 33                                                 33 
                                         Indonesia                                               Iran                                               Iraq 
                                                33                                                 33                                                 33 
                                           Ireland                                             Israel                                              Italy 
                                                33                                                 28                                                 33 
                                           Jamaica                                              Japan                                             Jordan 
                                                33                                                 33                                                 33 
                                        Kazakhstan                                              Kenya                                           Kiribati 
                                                33                                                 33                                                 33 
                                             Korea                                             Kosovo                                             Kuwait 
                                                33                                                 15                                                 31 
                                   Kyrgyz Republic                                            Lao PDR                          Late-demographic dividend 
                                                33                                                 33                                                 33 
                         Latin America & Caribbean  Latin America & Caribbean (excluding high income)             Latin America & Caribbean (IDA & IBRD) 
                                                33                                                 33                                                 33 
                                            Latvia       Least developed countries: UN classification                                            Lebanon 
                                                28                                                 33                                                 32 
                                           Lesotho                                            Liberia                                              Libya 
                                                33                                                 23                                                 24 
                                         Lithuania                                Low & middle income                                         Low income 
                                                28                                                 33                                                 33 
                               Lower middle income                                         Luxembourg                                   Macao SAR, China 
                                                33                                                 33                                                 33 
                                        Madagascar                                             Malawi                                           Malaysia 
                                                33                                                 33                                                 33 
                                          Maldives                                               Mali                                              Malta 
                                                28                                                 33                                                 33 
                                  Marshall Islands                                         Mauritania                                          Mauritius 
                                                33                                                 33                                                 33 
                                            Mexico                                         Micronesia                         Middle East & North Africa 
                                                33                                                 33                                                 33 
Middle East & North Africa (excluding high income)            Middle East & North Africa (IDA & IBRD)                                      Middle income 
                                                33                                                 33                                                 33 
                                           Moldova                                           Mongolia                                         Montenegro 
                                                28                                                 33                                                 26 
                                           Morocco                                         Mozambique                                            Myanmar 
                                                33                                                 33                                                 33 
                                           Namibia                                              Nauru                                              Nepal 
                                                33                                                 19                                                 33 
                                       Netherlands                                        New Zealand                                          Nicaragua 
                                                33                                                 33                                                 33 
                                             Niger                                            Nigeria                                      North America 
                                                33                                                 33                                                 33 
                                   North Macedonia                                             Norway                                       OECD members 
                                                33                                                 33                                                 33 
                                              Oman                                 Other small states                        Pacific island small states 
                                                33                                                 23                                                 33 
                                          Pakistan                                              Palau                                             Panama 
                                                33                                                 22                                                 33 
                                  Papua New Guinea                                           Paraguay                                               Peru 
                                                33                                                 33                                                 33 
                                       Philippines                                             Poland                                           Portugal 
                                                33                                                 33                                                 33 
                         Post-demographic dividend                           Pre-demographic dividend                                        Puerto Rico 
                                                33                                                 33                                                 33 
                                             Qatar                                            Romania                                             Russia 
                                                23                                                 33                                                 33 
                                            Rwanda                            São Tomé and Principe                                              Samoa 
                                                33                                                 22                                                 33 
                                        San Marino                                       Saudi Arabia                                            Senegal 
                                                25                                                 33                                                 33 
                                            Serbia                                         Seychelles                                       Sierra Leone 
                                                28                                                 33                                                 33 
                                         Singapore                          Sint Maarten (Dutch part)                                    Slovak Republic 
                                                33                                                 14                                                 31 
                                          Slovenia                                       Small states                                    Solomon Islands 
                                                28                                                 26                                                 33 
                                           Somalia                                       South Africa                                         South Asia 
                                                10                                                 33                                                 33 
                           South Asia (IDA & IBRD)                                              Spain                                          Sri Lanka 
                                                33                                                 33                                                 33 
                               St. Kitts and Nevis                                          St. Lucia                     St. Vincent and the Grenadines 
                                                33                                                 33                                                 33 
                                Sub-Saharan Africa         Sub-Saharan Africa (excluding high income)                    Sub-Saharan Africa (IDA & IBRD) 
                                                33                                                 33                                                 33 
                                             Sudan                                           Suriname                                             Sweden 
                                                33                                                 33                                                 33 
                                       Switzerland                                           Türkiye                                         Tajikistan 
                                                33                                                 33                                                 33 
                                          Tanzania                                           Thailand                                        The Bahamas 
                                                33                                                 33                                                 33 
                                        The Gambia                                        Timor-Leste                                               Togo 
                                                33                                                 23                                                 33 
                                             Tonga                                Trinidad and Tobago                                            Tunisia 
                                                32                                                 33                                                 33 
                                      Turkmenistan                           Turks and Caicos Islands                                             Tuvalu 
                                                31                                                 12                                                 33 
                                            Uganda                                            Ukraine                               United Arab Emirates 
                                                33                                                 33                                                 33 
                                    United Kingdom                                      United States                                Upper middle income 
                                                33                                                 33                                                 33 
                                           Uruguay                                         Uzbekistan                                            Vanuatu 
                                                33                                                 33                                                 33 
                                          Viet Nam                                 West Bank and Gaza                                              World 
                                                33                                                 29                                                 33 
                                            Zambia                                           Zimbabwe 
                                                33                                                 33 

num_obsv_ctry <- gdp_df_drop_rename |> 
  count(Country, sort = TRUE, name = "num_obsv_of_ctry")
tail(num_obsv_ctry)
NA
lowest_num_obsrv_ctry <- num_obsv_ctry |> 
  arrange(num_obsv_of_ctry) |> 
  slice(1:5)
lowest_num_obsrv_ctry
min(num_obsv_ctry$num_obsv_of_ctry, na.rm = TRUE)
[1] 10
  1. Create a new tibble by subsetting gdp_df to just the year 2021. Call this new tibble gdp_2021.

gdp_2021 <- gdp_df_drop_rename |> 
  filter(Year == "2021")

gdp_2021
NA
gdp_2021 |> 
  count(Year)
min(gdp_2021[,2])
[1] 2021
max(gdp_2021[,2])
[1] 2021
  1. Use summary() to find the summary statistics for GDP per capita in 2021.

summary(gdp_2021$GDP_Per_Capita)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   714.1   5044.2  13754.8  20711.6  30974.4 115683.5 
summary(gdp_2021)
   Country               Year      GDP_Per_Capita    
 Length:241         Min.   :2021   Min.   :   714.1  
 Class :character   1st Qu.:2021   1st Qu.:  5044.2  
 Mode  :character   Median :2021   Median : 13754.8  
                    Mean   :2021   Mean   : 20711.6  
                    3rd Qu.:2021   3rd Qu.: 30974.4  
                    Max.   :2021   Max.   :115683.5  
  1. Create a histogram of GDP Per Capita numbers for 2021 (you may wish to adjust the number of bins for your histogram).

ggplot( gdp_2021, aes( x= GDP_Per_Capita ) ) +
  geom_histogram( bins=50, color = "white", fill = "skyblue4" ) +
  labs(
    title = "GDP Per Capita in 2021",
    x = "GDP per Capita",
    y = "Frequency or Number of Countries"
  )

  1. Find the top 5 counties and bottom 5 countries by GDP per capita in 2021.
num_obsv_ctry_2021 <- gdp_2021 |> 
  arrange(GDP_Per_Capita, sort = TRUE)

num_obsv_ctry_2021
head(num_obsv_ctry_2021)
tail(num_obsv_ctry_2021)


lowest_gdp_2021 <- num_obsv_ctry_2021 |> 
  slice(1:5)

lowest_gdp_2021
NA

highest_gdp_2021 <- num_obsv_ctry_2021 |> 
  slice(tail(row_number(), 5))

highest_gdp_2021
NA
  1. Now, return to the full dataset, gdp_df. Pivot the data for 1990 and 2021 (using pivot_wider() function) so that each row corresponds to a country, each column corresponds to a year, and the values in the table give the GDP_Per_Capita amount. Drop any rows that are missing values for either 1990 or 2021. Save the result to a tibble named gdp_pivoted.


interim  <- gdp_df_drop_rename |>
  filter(Year == c(1990, 2021)) |> 

  pivot_wider(
      names_from = Year,
      values_from = GDP_Per_Capita
    )
gdp_pivoted <- interim[complete.cases(interim), ]
gdp_pivoted
NA
NA
  1. Create a new column in gdp_pivoted named Percent_Change. This column should contain the percent change in GDP_Per_Capita from 1990 to 2021. Hint: Percent change is calculated as 100*(New Value - Old Value) / Old Value.

gdp_pivoted$Percent_Change <- round(((gdp_pivoted$`2021` - gdp_pivoted$`1990`) / gdp_pivoted$`1990` )* 100, 4)
# gdp_pivoted$Percent_Change <- (((gdp_pivoted$`2021` - gdp_pivoted$`1990`) / gdp_pivoted$`1990` )* 100)
gdp_pivoted
  1. How many countries experienced a negative percent change in GDP per capita from 1990 to 2021? Nine (9) countries experienced a negative percent change in GDP per capita from 1990 to 2021.

gdp_pivoted[gdp_pivoted[4] < 0, ]
NA
  1. Which country had the highest % change in GDP per capita? Create a line plot showing these country’s GDP per capita for all years for which you have data. Put both line charts on the same plot.

gdp_pivoted[which.max(gdp_pivoted$Percent_Change),]


gdp_pivoted |> 
    arrange(desc(Percent_Change)) |> 
    slice(1:5)
NA

Create a line plot showing these country’s GDP per capita for all years for which you have data.


gdp_guyana  <- gdp_df_drop_rename |>
  filter(Country == "Guyana")
  
ggplot(data=gdp_guyana, aes(x=Year, y=GDP_Per_Capita, group=1)) +
  geom_line()+
  geom_point()


gdp_guyana
NA

gdp_albania  <- gdp_df_drop_rename |>
  filter(Country == "Albania")
  
ggplot(data=gdp_albania, aes(x=Year, y=GDP_Per_Capita, group=1)) +
  geom_line() +
  geom_point()


gdp_albania
NA

Put both line charts on the same plot.


gdp_albania
gdp_guyana

plot(gdp_albania$Year, gdp_albania$GDP_Per_Capita, 
     main = "GDP Per Capita Albania and Guyana 1990-2021",
     xlab = "Years",
     ylab = "GDP Per Capita",
     type = "l",
     ylim = c(0, 35000)
     )
# 
lines(gdp_guyana$Year, gdp_guyana$GDP_Per_Capita,
      lty = "dashed")
# 
labels <- c("Albania", "Guyana")
# 
legend("topleft", legend = labels,
       cex = 0.6,
       inset = 0.03,
       pch = NULL,
       lty = c(1, 2))


ggplot(data=gdp_albania, aes(x=Year, y=GDP_Per_Capita, group=1)) +
  geom_line(color="red")+
  geom_point(color="red")+
  labs(x = "Year", y = "GDP_Per_capita") +
  geom_point(data=gdp_guyana, color="darkgreen", aes(x=Year, y=GDP_Per_Capita, group=1) +
  geom_line(color="darkgreen")
             )

  1. Read in continents.csv contained in the data folder into a new tibble called continents. We will be using this tibble to add a new column to our dataset.

continents <- read_csv("../data/continents.csv")


continents
# head(continents, 10)
  1. Merge gdp_df and continents. Keep only the countries that appear in both data frames. Save the result back to gdp_df.

gdp_df <- merge(gdp_df_drop_rename, continents, by="Country")
gdp_df
  1. Determine the number of countries per continent. Create a bar chart showing this.

num_continents <- gdp_df |> 
  group_by(Continent) |> 
  summarise(Num_Countries_per_Continent = n_distinct(Country))

num_continents
NA
  1. Create a boxplot showing GDP per capita in 2021 split out by continent. What do you notice?

gdp_df_2021_continents  <- gdp_df |>
  filter(Year == 2021)

gdp_df_2021_continents

my_colors <- c("#FFA500", "#008000", "#1E90FF", "#FF1493", "red", "purple")

boxplot(GDP_Per_Capita ~ Continent, data = gdp_df_2021_continents,
      main = "GDP per Capita in 2021 by Continent", xlab = "Continents", ylab = "GDP Per Capita",
      col = my_colors, border = "black", notch = FALSE, notchwidth = 0.5,
      medcol = "white", whiskcol = "black", boxwex = 0.5, outpch = 19,
      outcol = "black"
      )

# text(seq_along(unique(gdp_df_2021_continents$Continent)), par("usr")[3], 
#     labels = seq_along(unique(gdp_df_2021_continents$Continent)), srt = 45, adj = c(1.1, 1.1), xpd = TRUE)
# 
# boxplot(GDP_Per_Capita ~ Continent, data = gdp_df_2021_continents, pars  =  list(xaxt = "n"))
# axis(2, at=gdp_df_2021_continents$Continent, labels = TRUE)
# text(y = seq(0, 100, by=20), par("usr")[1], labels = lablist.y, srt = 45, pos = 2, xpd = TRUE)
# # axis(1, at=c(1,2), labels = FALSE)
# text(c(1:6), par("usr")[3] - 1, labels = gdp_df_2021_continents$Continent, srt = 45, pos = 1, xpd = TRUE)
# text(y = seq(1, 6, by=20), par("usr")[1], labels = gdp_df_2021_continents$Continents, srt = 45, pos = 1, xpd = TRUE)
  1. Read life_expectancy.csv into a tibble named life_expectancy. Do not modify the csv file in order to read this data in.

life_expectancy <- read_csv("../data/life_expectancy.csv", skip = 4)
life_expectancy
NA
  1. Drop the Country Code, Indicator Name, and Indicator Code columns. Then use pivot_longer to convert your data from wide to long. That is, instead of having one row per country and multiple colums per year, we want to have multiple rows per country and a single column for year. After melting, rename the columns to Country, Year, and Life_Expectancy.


life_expectancy_rename <- life_expectancy |> 
  rename(c(Country_Code = `Country Code`, Indicator_Name = `Indicator Name`, Indicator_Code = `Indicator Code`))


drop.cols <- c("Country_Code", "Indicator_Name", "Indicator_Code", "2023", "...69")
 
 
life_expectancy_dropped <- life_expectancy_rename |>
  select(-one_of(drop.cols))
 
life_expectancy_dropped
NA

country_life_expectancy <- life_expectancy_dropped |> 
  pivot_longer(!`Country Name`, names_to = "Year", values_to = "Life_Expectancy") |> 
  rename(Country = `Country Name`)

country_life_expectancy
NA

country_life_expectancy |> 
  filter(Country=="Zimbabwe")
NA
  1. What was the first country with a life expectancy to exceed 80? JAPAN in 1996

country_life_expectancy |> 
  filter(Life_Expectancy >= 80) |> 
  arrange(Year) |> 
  slice(1:10) 
  
# |> 
#   group_by(Country) |> 
#   slice(1:10) |> 
#   ungroup() |> 
#   arrange(Year)
# country_life_expectancy  |> 
#   filter(as.numeric(as.character(Life_Expectancy)) >= 80) |> 
#   arrange(Year)
  1. Merge gdp_df and life_expectancy, keeping all countries and years that appear in both tibbles. Save the result to a new tibble named gdp_le. If you get any errors in doing this, read them carefully and correct them. Look at the first five rows of your new data frame to confirm it merged correctly. Also, check the last five rows to make sure the data is clean and as expected.

gdp_le <- merge(gdp_df, country_life_expectancy, by=c("Country", "Year"))
head(gdp_le)
tail(gdp_le)
NA

gdp_le |> 
  filter(Country=="United Kingdom")
NA
  1. Create a new tibble, named gdp_le_2021 by extracting data for the year 2021 from gdp_le. How many countries have a life expectancy of at least 80 in 2021?

gdp_le_2021 <- gdp_le |> 
  filter(Year == "2021")
# 
gdp_le_2021
NA

How many countries have a life expectancy of at least 80 in 2021?


gdp_le_2021 |> 
  filter(Life_Expectancy >= 80)
NA
NA

length(which(gdp_le_2021$Life_Expectancy >= 80))
[1] 31
  1. Find the countries that had the top 3 largest GDP per capita figures for 2021. Create a plot showing the change in life expectancy over time for these three countries. This plot should be faceted so that each country is contained in its own figure.

gdp_le_2021 |> 
  arrange(desc(GDP_Per_Capita)) |> 
  slice(1:3) 
NA

Create a plot showing the change in life expectancy over time for these three countries. This plot should be faceted so that each country is contained in its own figure.

life_exp_facet <- country_life_expectancy |> 
  filter(Country == c("Luxembourg", "Singapore", "Ireland"))
# 
# ggplot(life_exp_facet, aes(x = Year, y = Life_Expectancy, color = Country)) +
#   geom_line() +
#   labs(title = "Life Expectancy over time",
#        y = "Life Expectancy",
#        color = "Country") +
#   facet_grid(. ~ Country)

# ggplot(data = life_exp_facet, aes(x = Year, y = Life_Expectancy)) +
#   geom_line(color = "steelblue") +
#   labs(title = "Life Expectancy Over Time",
#        x = "Year",
#        y = "Life Expectancy") +
#   facet_wrap(~ Country, ncol = 3) +
#   theme_bw()
life_exp_facet |> 
  ggplot(aes(x=Year, y=Life_Expectancy)) +
  geom_point() +
  facet_grid(cols = vars(Country))

  1. Create a scatter plot of Life Expectancy vs GDP per Capita for the year 2021. What do you notice? I notice that it appears to have a curved and positive relationship.

input <- gdp_le_2021[, c("Life_Expectancy", "GDP_Per_Capita")]

plot(x = input$Life_Expectancy, y = input$GDP_Per_Capita,
    xlab = "Life Expectancy",
    ylab = "GDP Per Capita",
    main = "Weight vs Milage"
)


# ggplot(gdp_le_2021, aes(x = "Life_Expectancy", y = "GDP_Per_Capita")) +
#         geom_point(aes(color = factor(Continent)))
  1. Find the correlation between Life Expectancy and GDP per Capita for the year 2021. What is the meaning of this number?
gdp_le_2021_dropped <- gdp_le_2021  |> 
  filter(!is.na(Life_Expectancy) & !is.na(GDP_Per_Capita))

cor(gdp_le_2021_dropped$Life_Expectancy, gdp_le_2021_dropped$GDP_Per_Capita, method = "pearson")
[1] 0.7450812

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLg0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouDQoNCmBgYHtyfQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQoxLiAgVXNpbmcgdGhlIHJlYWRfY3N2KCkgZnVuY3Rpb24sIHJlYWQgdGhlIEdEUCBkYXRhc2V0IGludG8geW91ciBub3RlYm9vayBhcyBhIHRpYmJsZSBjYWxsZWQgZ2RwX2RmLiBBZnRlciByZWFkaW5nIGl0IGluLCBpbnNwZWN0IHRoZSBmaXJzdCAxMCByb3dzIGFuZCB0aGVuIGluc3BlY3QgdGhlIGxhc3QgMTAgcm93cy4NCg0KYGBge3J9DQoNCmdkcF9kZiA8LSByZWFkX2NzdigiLi4vZGF0YS9nZHBfcGVyX2NhcGl0YS5jc3YiKQ0KDQpoZWFkKGdkcF9kZiwgMTApDQoNCmBgYA0KDQpgYGB7cn0NCnRhaWwoZ2RwX2RmLCAxMCkNCmBgYA0KDQoyLiAgRHJvcCB0aGUgJ1ZhbHVlIEZvb3Rub3RlcycgY29sdW1uLCBhbmQgcmVuYW1lIHRoZSByZW1haW5pbmcgY29sdW1ucyB0byAnQ291bnRyeScsICdZZWFyJywgYW5kICdHRFBfUGVyX0NhcGl0YScuDQoNCmBgYHtyfQ0KDQpnZHBfZGZfZHJvcCA8LSBnZHBfZGYgfD4gDQogIHNlbGVjdCgtYFZhbHVlIEZvb3Rub3Rlc2ApDQoNCg0KZ2RwX2RmX2Ryb3ANCg0KYGBgDQoNCmBgYHtyfQ0KDQpnZHBfZGZfZHJvcF9yZW5hbWUgPC0gZ2RwX2RmX2Ryb3AgfD4gDQogIHJlbmFtZShjKEdEUF9QZXJfQ2FwaXRhID0gVmFsdWUsIENvdW50cnkgPSBgQ291bnRyeSBvciBBcmVhYCkpDQoNCmdkcF9kZl9kcm9wX3JlbmFtZQ0KYGBgDQoNCjMuICBXaGljaCB5ZWFycyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhpcyBkYXRhc2V0PyBIb3cgbWFueSBvYnNlcnZhdGlvbnMgYXJlIHRoZXJlIHBlciB5ZWFyPyBNYWtlIGEgcGxvdCB0byB2aWV3IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIHBlciB5ZWFyLg0KDQpgYGB7cn0NCm1pbihnZHBfZGZfZHJvcF9yZW5hbWVbLDJdKQ0KbWF4KGdkcF9kZl9kcm9wX3JlbmFtZVssMl0pDQpgYGANCg0KSG93IG1hbnkgb2JzZXJ2YXRpb25zIGFyZSB0aGVyZSBwZXIgeWVhcj8NCg0KYGBge3J9DQpub19vYnN2X3llYXIgPC0gZ2RwX2RmX2Ryb3BfcmVuYW1lIHw+IA0KICBjb3VudChZZWFyKQ0Kbm9fb2Jzdl95ZWFyDQpgYGANCg0KTWFrZSBhIHBsb3QgdG8gdmlldyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBwZXIgeWVhci4NCg0KYGBge3J9DQpub19vYnN2X3llYXIgfD4gDQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBuKSkgKyANCiAgICBnZW9tX2NvbCgpDQpgYGANCg0KNC4gIEhvdyBtYW55IGNvdW50cmllcyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhpcyBkYXRhc2V0PyBXaGljaCBjb3VudHJpZXMgaGF2ZSB0aGUgZmV3ZXN0IG9ic2VydmF0aW9ucz8NCg0KYGBge3J9DQoNCm5vX29ic3ZfY3RyeSA8LSBnZHBfZGZfZHJvcF9yZW5hbWUgfD4gDQogIGNvdW50KENvdW50cnkpDQpub19vYnN2X2N0cnkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpnZHBfZGZfZHJvcF9yZW5hbWUgfD4gDQogIGRpc3RpbmN0KENvdW50cnlbIWlzLm5hKENvdW50cnkpXSkNCg0KZ2RwX2RmX2Ryb3BfcmVuYW1lIHw+IA0KICBkaXN0aW5jdChDb3VudHJ5KQ0KDQpgYGANCg0KYGBge3J9DQoNCmxlbmd0aCh1bmlxdWUoZ2RwX2RmX2Ryb3BfcmVuYW1lJENvdW50cnkpKQ0KDQpgYGANCg0KV2hpY2ggY291bnRyaWVzIGhhdmUgdGhlIGZld2VzdCBvYnNlcnZhdGlvbnM/DQoNCmBgYHtyfQ0KDQptaW4obm9fb2Jzdl9jdHJ5JG4pDQoNCmBgYA0KDQpgYGB7cn0NCm5vX29ic3ZfY3RyeSB8PiANCiAgbXV0YXRlKGZyZXEgPSBtaW4obikpDQoNCmBgYA0KDQpgYGB7cn0NCg0KdGFpbChzb3J0KG5vX29ic3ZfY3RyeSRDb3VudHJ5KSwgMykNCg0KYGBgDQoNCmBgYHtyfQ0KDQp3aXRoKHVuaXF1ZShub19vYnN2X2N0cnlbYygiQ291bnRyeSIsICJuIildKSwgdGFibGUobm9fb2Jzdl9jdHJ5KSkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKGdkcF9kZl9kcm9wX3JlbmFtZSRDb3VudHJ5KQ0KYGBgDQoNCmBgYHtyfQ0KDQpudW1fb2Jzdl9jdHJ5IDwtIGdkcF9kZl9kcm9wX3JlbmFtZSB8PiANCiAgY291bnQoQ291bnRyeSwgc29ydCA9IFRSVUUsIG5hbWUgPSAibnVtX29ic3Zfb2ZfY3RyeSIpDQp0YWlsKG51bV9vYnN2X2N0cnkpDQoNCmBgYA0KDQpgYGB7cn0NCmxvd2VzdF9udW1fb2JzcnZfY3RyeSA8LSBudW1fb2Jzdl9jdHJ5IHw+IA0KICBhcnJhbmdlKG51bV9vYnN2X29mX2N0cnkpIHw+IA0KICBzbGljZSgxOjUpDQpsb3dlc3RfbnVtX29ic3J2X2N0cnkNCmBgYA0KDQpgYGB7cn0NCm1pbihudW1fb2Jzdl9jdHJ5JG51bV9vYnN2X29mX2N0cnksIG5hLnJtID0gVFJVRSkNCmBgYA0KDQo1LiAgQ3JlYXRlIGEgbmV3IHRpYmJsZSBieSBzdWJzZXR0aW5nIGdkcF9kZiB0byBqdXN0IHRoZSB5ZWFyIDIwMjEuIENhbGwgdGhpcyBuZXcgdGliYmxlIGdkcF8yMDIxLg0KDQpgYGB7cn0NCg0KZ2RwXzIwMjEgPC0gZ2RwX2RmX2Ryb3BfcmVuYW1lIHw+IA0KICBmaWx0ZXIoWWVhciA9PSAiMjAyMSIpDQoNCmdkcF8yMDIxDQoNCmBgYA0KDQpgYGB7cn0NCmdkcF8yMDIxIHw+IA0KICBjb3VudChZZWFyKQ0KbWluKGdkcF8yMDIxWywyXSkNCm1heChnZHBfMjAyMVssMl0pDQpgYGANCg0KNi4gIFVzZSBzdW1tYXJ5KCkgdG8gZmluZCB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIGZvciBHRFAgcGVyIGNhcGl0YSBpbiAyMDIxLg0KDQpgYGB7cn0NCg0Kc3VtbWFyeShnZHBfMjAyMSRHRFBfUGVyX0NhcGl0YSkNCnN1bW1hcnkoZ2RwXzIwMjEpDQoNCmBgYA0KDQo3LiAgQ3JlYXRlIGEgaGlzdG9ncmFtIG9mIEdEUCBQZXIgQ2FwaXRhIG51bWJlcnMgZm9yIDIwMjEgKHlvdSBtYXkgd2lzaCB0byBhZGp1c3QgdGhlIG51bWJlciBvZiBiaW5zIGZvciB5b3VyIGhpc3RvZ3JhbSkuDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoIGdkcF8yMDIxLCBhZXMoIHg9IEdEUF9QZXJfQ2FwaXRhICkgKSArDQogIGdlb21faGlzdG9ncmFtKCBiaW5zPTUwLCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAic2t5Ymx1ZTQiICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdEUCBQZXIgQ2FwaXRhIGluIDIwMjEiLA0KICAgIHggPSAiR0RQIHBlciBDYXBpdGEiLA0KICAgIHkgPSAiRnJlcXVlbmN5IG9yIE51bWJlciBvZiBDb3VudHJpZXMiDQogICkNCg0KYGBgDQoNCjguICBGaW5kIHRoZSB0b3AgNSBjb3VudGllcyBhbmQgYm90dG9tIDUgY291bnRyaWVzIGJ5IEdEUCBwZXIgY2FwaXRhIGluIDIwMjEuDQoNCmBgYHtyfQ0KbnVtX29ic3ZfY3RyeV8yMDIxIDwtIGdkcF8yMDIxIHw+IA0KICBhcnJhbmdlKEdEUF9QZXJfQ2FwaXRhLCBzb3J0ID0gVFJVRSkNCg0KbnVtX29ic3ZfY3RyeV8yMDIxDQpoZWFkKG51bV9vYnN2X2N0cnlfMjAyMSkNCnRhaWwobnVtX29ic3ZfY3RyeV8yMDIxKQ0KYGBgDQoNCmBgYHtyfQ0KDQoNCmxvd2VzdF9nZHBfMjAyMSA8LSBudW1fb2Jzdl9jdHJ5XzIwMjEgfD4gDQogIHNsaWNlKDE6NSkNCg0KbG93ZXN0X2dkcF8yMDIxDQoNCmBgYA0KDQpgYGB7cn0NCg0KaGlnaGVzdF9nZHBfMjAyMSA8LSBudW1fb2Jzdl9jdHJ5XzIwMjEgfD4gDQogIHNsaWNlKHRhaWwocm93X251bWJlcigpLCA1KSkNCg0KaGlnaGVzdF9nZHBfMjAyMQ0KDQpgYGANCg0KOS4gIE5vdywgcmV0dXJuIHRvIHRoZSBmdWxsIGRhdGFzZXQsIGdkcF9kZi4gUGl2b3QgdGhlIGRhdGEgZm9yIDE5OTAgYW5kIDIwMjEgKHVzaW5nIHBpdm90X3dpZGVyKCkgZnVuY3Rpb24pIHNvIHRoYXQgZWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSBjb3VudHJ5LCBlYWNoIGNvbHVtbiBjb3JyZXNwb25kcyB0byBhIHllYXIsIGFuZCB0aGUgdmFsdWVzIGluIHRoZSB0YWJsZSBnaXZlIHRoZSBHRFBfUGVyX0NhcGl0YSBhbW91bnQuIERyb3AgYW55IHJvd3MgdGhhdCBhcmUgbWlzc2luZyB2YWx1ZXMgZm9yIGVpdGhlciAxOTkwIG9yIDIwMjEuIFNhdmUgdGhlIHJlc3VsdCB0byBhIHRpYmJsZSBuYW1lZCBnZHBfcGl2b3RlZC4NCg0KYGBge3J9DQoNCg0KaW50ZXJpbSAgPC0gZ2RwX2RmX2Ryb3BfcmVuYW1lIHw+DQogIGZpbHRlcihZZWFyID09IGMoMTk5MCwgMjAyMSkpIHw+IA0KDQogIHBpdm90X3dpZGVyKA0KICAgICAgbmFtZXNfZnJvbSA9IFllYXIsDQogICAgICB2YWx1ZXNfZnJvbSA9IEdEUF9QZXJfQ2FwaXRhDQogICAgKQ0KZ2RwX3Bpdm90ZWQgPC0gaW50ZXJpbVtjb21wbGV0ZS5jYXNlcyhpbnRlcmltKSwgXQ0KZ2RwX3Bpdm90ZWQNCg0KDQpgYGANCg0KMTAuIENyZWF0ZSBhIG5ldyBjb2x1bW4gaW4gZ2RwX3Bpdm90ZWQgbmFtZWQgUGVyY2VudF9DaGFuZ2UuIFRoaXMgY29sdW1uIHNob3VsZCBjb250YWluIHRoZSBwZXJjZW50IGNoYW5nZSBpbiBHRFBfUGVyX0NhcGl0YSBmcm9tIDE5OTAgdG8gMjAyMS4gSGludDogUGVyY2VudCBjaGFuZ2UgaXMgY2FsY3VsYXRlZCBhcyAxMDBcKihOZXcgVmFsdWUgLSBPbGQgVmFsdWUpIC8gT2xkIFZhbHVlLg0KDQpgYGB7cn0NCg0KZ2RwX3Bpdm90ZWQkUGVyY2VudF9DaGFuZ2UgPC0gcm91bmQoKChnZHBfcGl2b3RlZCRgMjAyMWAgLSBnZHBfcGl2b3RlZCRgMTk5MGApIC8gZ2RwX3Bpdm90ZWQkYDE5OTBgICkqIDEwMCwgNCkNCiMgZ2RwX3Bpdm90ZWQkUGVyY2VudF9DaGFuZ2UgPC0gKCgoZ2RwX3Bpdm90ZWQkYDIwMjFgIC0gZ2RwX3Bpdm90ZWQkYDE5OTBgKSAvIGdkcF9waXZvdGVkJGAxOTkwYCApKiAxMDApDQpnZHBfcGl2b3RlZA0KYGBgDQoNCjExLiBIb3cgbWFueSBjb3VudHJpZXMgZXhwZXJpZW5jZWQgYSBuZWdhdGl2ZSBwZXJjZW50IGNoYW5nZSBpbiBHRFAgcGVyIGNhcGl0YSBmcm9tIDE5OTAgdG8gMjAyMT8gTmluZSAoOSkgY291bnRyaWVzIGV4cGVyaWVuY2VkIGEgbmVnYXRpdmUgcGVyY2VudCBjaGFuZ2UgaW4gR0RQIHBlciBjYXBpdGEgZnJvbSAxOTkwIHRvIDIwMjEuDQoNCmBgYHtyfQ0KDQpnZHBfcGl2b3RlZFtnZHBfcGl2b3RlZFs0XSA8IDAsIF0NCg0KYGBgDQoNCjEyLiBXaGljaCBjb3VudHJ5IGhhZCB0aGUgaGlnaGVzdCAlIGNoYW5nZSBpbiBHRFAgcGVyIGNhcGl0YT8gQ3JlYXRlIGEgbGluZSBwbG90IHNob3dpbmcgdGhlc2UgY291bnRyeSdzIEdEUCBwZXIgY2FwaXRhIGZvciBhbGwgeWVhcnMgZm9yIHdoaWNoIHlvdSBoYXZlIGRhdGEuIFB1dCBib3RoIGxpbmUgY2hhcnRzIG9uIHRoZSBzYW1lIHBsb3QuDQoNCmBgYHtyfQ0KDQpnZHBfcGl2b3RlZFt3aGljaC5tYXgoZ2RwX3Bpdm90ZWQkUGVyY2VudF9DaGFuZ2UpLF0NCg0KDQpnZHBfcGl2b3RlZCB8PiANCiAgICBhcnJhbmdlKGRlc2MoUGVyY2VudF9DaGFuZ2UpKSB8PiANCiAgICBzbGljZSgxOjUpDQoNCmBgYA0KDQpDcmVhdGUgYSBsaW5lIHBsb3Qgc2hvd2luZyB0aGVzZSBjb3VudHJ5J3MgR0RQIHBlciBjYXBpdGEgZm9yIGFsbCB5ZWFycyBmb3Igd2hpY2ggeW91IGhhdmUgZGF0YS4NCg0KYGBge3J9DQoNCmdkcF9ndXlhbmEgIDwtIGdkcF9kZl9kcm9wX3JlbmFtZSB8Pg0KICBmaWx0ZXIoQ291bnRyeSA9PSAiR3V5YW5hIikNCiAgDQpnZ3Bsb3QoZGF0YT1nZHBfZ3V5YW5hLCBhZXMoeD1ZZWFyLCB5PUdEUF9QZXJfQ2FwaXRhLCBncm91cD0xKSkgKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpDQoNCmdkcF9ndXlhbmENCg0KYGBgDQoNCmBgYHtyfQ0KDQpnZHBfYWxiYW5pYSAgPC0gZ2RwX2RmX2Ryb3BfcmVuYW1lIHw+DQogIGZpbHRlcihDb3VudHJ5ID09ICJBbGJhbmlhIikNCiAgDQpnZ3Bsb3QoZGF0YT1nZHBfYWxiYW5pYSwgYWVzKHg9WWVhciwgeT1HRFBfUGVyX0NhcGl0YSwgZ3JvdXA9MSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkNCg0KZ2RwX2FsYmFuaWENCg0KYGBgDQoNClB1dCBib3RoIGxpbmUgY2hhcnRzIG9uIHRoZSBzYW1lIHBsb3QuDQoNCmBgYHtyfQ0KDQpnZHBfYWxiYW5pYQ0KZ2RwX2d1eWFuYQ0KDQpwbG90KGdkcF9hbGJhbmlhJFllYXIsIGdkcF9hbGJhbmlhJEdEUF9QZXJfQ2FwaXRhLCANCiAgICAgbWFpbiA9ICJHRFAgUGVyIENhcGl0YSBBbGJhbmlhIGFuZCBHdXlhbmEgMTk5MC0yMDIxIiwNCiAgICAgeGxhYiA9ICJZZWFycyIsDQogICAgIHlsYWIgPSAiR0RQIFBlciBDYXBpdGEiLA0KICAgICB0eXBlID0gImwiLA0KICAgICB5bGltID0gYygwLCAzNTAwMCkNCiAgICAgKQ0KIyANCmxpbmVzKGdkcF9ndXlhbmEkWWVhciwgZ2RwX2d1eWFuYSRHRFBfUGVyX0NhcGl0YSwNCiAgICAgIGx0eSA9ICJkYXNoZWQiKQ0KIyANCmxhYmVscyA8LSBjKCJBbGJhbmlhIiwgIkd1eWFuYSIpDQojIA0KbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gbGFiZWxzLA0KICAgICAgIGNleCA9IDAuNiwNCiAgICAgICBpbnNldCA9IDAuMDMsDQogICAgICAgcGNoID0gTlVMTCwNCiAgICAgICBsdHkgPSBjKDEsIDIpKQ0KDQpgYGANCg0KYGBge3J9DQoNCmdncGxvdChkYXRhPWdkcF9hbGJhbmlhLCBhZXMoeD1ZZWFyLCB5PUdEUF9QZXJfQ2FwaXRhLCBncm91cD0xKSkgKw0KICBnZW9tX2xpbmUoY29sb3I9InJlZCIpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKSsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIkdEUF9QZXJfY2FwaXRhIikgKw0KICBnZW9tX3BvaW50KGRhdGE9Z2RwX2d1eWFuYSwgY29sb3I9ImRhcmtncmVlbiIsIGFlcyh4PVllYXIsIHk9R0RQX1Blcl9DYXBpdGEsIGdyb3VwPTEpICsNCiAgZ2VvbV9saW5lKGNvbG9yPSJkYXJrZ3JlZW4iKQ0KICAgICAgICAgICAgICkNCg0KYGBgDQoNCjEzLiBSZWFkIGluIGNvbnRpbmVudHMuY3N2IGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBmb2xkZXIgaW50byBhIG5ldyB0aWJibGUgY2FsbGVkIGNvbnRpbmVudHMuIFdlIHdpbGwgYmUgdXNpbmcgdGhpcyB0aWJibGUgdG8gYWRkIGEgbmV3IGNvbHVtbiB0byBvdXIgZGF0YXNldC4NCg0KYGBge3J9DQoNCmNvbnRpbmVudHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvY29udGluZW50cy5jc3YiKQ0KDQoNCmNvbnRpbmVudHMNCiMgaGVhZChjb250aW5lbnRzLCAxMCkNCg0KYGBgDQoNCjE0LiBNZXJnZSBnZHBfZGYgYW5kIGNvbnRpbmVudHMuIEtlZXAgb25seSB0aGUgY291bnRyaWVzIHRoYXQgYXBwZWFyIGluIGJvdGggZGF0YSBmcmFtZXMuIFNhdmUgdGhlIHJlc3VsdCBiYWNrIHRvIGdkcF9kZi4NCg0KYGBge3J9DQoNCmdkcF9kZiA8LSBtZXJnZShnZHBfZGZfZHJvcF9yZW5hbWUsIGNvbnRpbmVudHMsIGJ5PSJDb3VudHJ5IikNCmdkcF9kZg0KYGBgDQoNCjE1LiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb3VudHJpZXMgcGVyIGNvbnRpbmVudC4gQ3JlYXRlIGEgYmFyIGNoYXJ0IHNob3dpbmcgdGhpcy4NCg0KYGBge3J9DQoNCm51bV9jb250aW5lbnRzIDwtIGdkcF9kZiB8PiANCiAgZ3JvdXBfYnkoQ29udGluZW50KSB8PiANCiAgc3VtbWFyaXNlKE51bV9Db3VudHJpZXNfcGVyX0NvbnRpbmVudCA9IG5fZGlzdGluY3QoQ291bnRyeSkpDQoNCm51bV9jb250aW5lbnRzDQoNCmBgYA0KDQoxNi4gQ3JlYXRlIGEgYm94cGxvdCBzaG93aW5nIEdEUCBwZXIgY2FwaXRhIGluIDIwMjEgc3BsaXQgb3V0IGJ5IGNvbnRpbmVudC4gV2hhdCBkbyB5b3Ugbm90aWNlPw0KDQpgYGB7cn0NCg0KZ2RwX2RmXzIwMjFfY29udGluZW50cyAgPC0gZ2RwX2RmIHw+DQogIGZpbHRlcihZZWFyID09IDIwMjEpDQoNCmdkcF9kZl8yMDIxX2NvbnRpbmVudHMNCg0KbXlfY29sb3JzIDwtIGMoIiNGRkE1MDAiLCAiIzAwODAwMCIsICIjMUU5MEZGIiwgIiNGRjE0OTMiLCAicmVkIiwgInB1cnBsZSIpDQoNCmJveHBsb3QoR0RQX1Blcl9DYXBpdGEgfiBDb250aW5lbnQsIGRhdGEgPSBnZHBfZGZfMjAyMV9jb250aW5lbnRzLA0KICAgICAgbWFpbiA9ICJHRFAgcGVyIENhcGl0YSBpbiAyMDIxIGJ5IENvbnRpbmVudCIsIHhsYWIgPSAiQ29udGluZW50cyIsIHlsYWIgPSAiR0RQIFBlciBDYXBpdGEiLA0KICAgICAgY29sID0gbXlfY29sb3JzLCBib3JkZXIgPSAiYmxhY2siLCBub3RjaCA9IEZBTFNFLCBub3RjaHdpZHRoID0gMC41LA0KICAgICAgbWVkY29sID0gIndoaXRlIiwgd2hpc2tjb2wgPSAiYmxhY2siLCBib3h3ZXggPSAwLjUsIG91dHBjaCA9IDE5LA0KICAgICAgb3V0Y29sID0gImJsYWNrIg0KICAgICAgKQ0KIyB0ZXh0KHNlcV9hbG9uZyh1bmlxdWUoZ2RwX2RmXzIwMjFfY29udGluZW50cyRDb250aW5lbnQpKSwgcGFyKCJ1c3IiKVszXSwgDQojICAgICBsYWJlbHMgPSBzZXFfYWxvbmcodW5pcXVlKGdkcF9kZl8yMDIxX2NvbnRpbmVudHMkQ29udGluZW50KSksIHNydCA9IDQ1LCBhZGogPSBjKDEuMSwgMS4xKSwgeHBkID0gVFJVRSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyANCiMgYm94cGxvdChHRFBfUGVyX0NhcGl0YSB+IENvbnRpbmVudCwgZGF0YSA9IGdkcF9kZl8yMDIxX2NvbnRpbmVudHMsIHBhcnMgID0gIGxpc3QoeGF4dCA9ICJuIikpDQojIGF4aXMoMiwgYXQ9Z2RwX2RmXzIwMjFfY29udGluZW50cyRDb250aW5lbnQsIGxhYmVscyA9IFRSVUUpDQojIHRleHQoeSA9IHNlcSgwLCAxMDAsIGJ5PTIwKSwgcGFyKCJ1c3IiKVsxXSwgbGFiZWxzID0gbGFibGlzdC55LCBzcnQgPSA0NSwgcG9zID0gMiwgeHBkID0gVFJVRSkNCiMgIyBheGlzKDEsIGF0PWMoMSwyKSwgbGFiZWxzID0gRkFMU0UpDQojIHRleHQoYygxOjYpLCBwYXIoInVzciIpWzNdIC0gMSwgbGFiZWxzID0gZ2RwX2RmXzIwMjFfY29udGluZW50cyRDb250aW5lbnQsIHNydCA9IDQ1LCBwb3MgPSAxLCB4cGQgPSBUUlVFKQ0KIyB0ZXh0KHkgPSBzZXEoMSwgNiwgYnk9MjApLCBwYXIoInVzciIpWzFdLCBsYWJlbHMgPSBnZHBfZGZfMjAyMV9jb250aW5lbnRzJENvbnRpbmVudHMsIHNydCA9IDQ1LCBwb3MgPSAxLCB4cGQgPSBUUlVFKQ0KDQpgYGANCg0KMTcuIFJlYWQgbGlmZV9leHBlY3RhbmN5LmNzdiBpbnRvIGEgdGliYmxlIG5hbWVkIGxpZmVfZXhwZWN0YW5jeS4gRG8gbm90IG1vZGlmeSB0aGUgY3N2IGZpbGUgaW4gb3JkZXIgdG8gcmVhZCB0aGlzIGRhdGEgaW4uDQoNCmBgYHtyfQ0KDQpsaWZlX2V4cGVjdGFuY3kgPC0gcmVhZF9jc3YoIi4uL2RhdGEvbGlmZV9leHBlY3RhbmN5LmNzdiIsIHNraXAgPSA0KQ0KbGlmZV9leHBlY3RhbmN5DQoNCmBgYA0KDQoNCjE4LiBEcm9wIHRoZSBDb3VudHJ5IENvZGUsIEluZGljYXRvciBOYW1lLCBhbmQgSW5kaWNhdG9yIENvZGUgY29sdW1ucy4gVGhlbiB1c2UgcGl2b3RfbG9uZ2VyIHRvIGNvbnZlcnQgeW91ciBkYXRhIGZyb20gd2lkZSB0byBsb25nLiBUaGF0IGlzLCBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgcm93IHBlciBjb3VudHJ5IGFuZCBtdWx0aXBsZSBjb2x1bXMgcGVyIHllYXIsIHdlIHdhbnQgdG8gaGF2ZSBtdWx0aXBsZSByb3dzIHBlciBjb3VudHJ5IGFuZCBhIHNpbmdsZSBjb2x1bW4gZm9yIHllYXIuIEFmdGVyIG1lbHRpbmcsIHJlbmFtZSB0aGUgY29sdW1ucyB0byBDb3VudHJ5LCBZZWFyLCBhbmQgTGlmZV9FeHBlY3RhbmN5Lg0KDQpgYGB7cn0NCg0KDQpsaWZlX2V4cGVjdGFuY3lfcmVuYW1lIDwtIGxpZmVfZXhwZWN0YW5jeSB8PiANCiAgcmVuYW1lKGMoQ291bnRyeV9Db2RlID0gYENvdW50cnkgQ29kZWAsIEluZGljYXRvcl9OYW1lID0gYEluZGljYXRvciBOYW1lYCwgSW5kaWNhdG9yX0NvZGUgPSBgSW5kaWNhdG9yIENvZGVgKSkNCg0KDQpkcm9wLmNvbHMgPC0gYygiQ291bnRyeV9Db2RlIiwgIkluZGljYXRvcl9OYW1lIiwgIkluZGljYXRvcl9Db2RlIiwgIjIwMjMiLCAiLi4uNjkiKQ0KIA0KIA0KbGlmZV9leHBlY3RhbmN5X2Ryb3BwZWQgPC0gbGlmZV9leHBlY3RhbmN5X3JlbmFtZSB8Pg0KICBzZWxlY3QoLW9uZV9vZihkcm9wLmNvbHMpKQ0KIA0KbGlmZV9leHBlY3RhbmN5X2Ryb3BwZWQNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmNvdW50cnlfbGlmZV9leHBlY3RhbmN5IDwtIGxpZmVfZXhwZWN0YW5jeV9kcm9wcGVkIHw+IA0KICBwaXZvdF9sb25nZXIoIWBDb3VudHJ5IE5hbWVgLCBuYW1lc190byA9ICJZZWFyIiwgdmFsdWVzX3RvID0gIkxpZmVfRXhwZWN0YW5jeSIpIHw+IA0KICByZW5hbWUoQ291bnRyeSA9IGBDb3VudHJ5IE5hbWVgKQ0KDQpjb3VudHJ5X2xpZmVfZXhwZWN0YW5jeQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KY291bnRyeV9saWZlX2V4cGVjdGFuY3kgfD4gDQogIGZpbHRlcihDb3VudHJ5PT0iWmltYmFid2UiKQ0KDQpgYGANCg0KMTkuIFdoYXQgd2FzIHRoZSBmaXJzdCBjb3VudHJ5IHdpdGggYSBsaWZlIGV4cGVjdGFuY3kgdG8gZXhjZWVkIDgwPw0KSkFQQU4gaW4gMTk5Ng0KYGBge3J9DQoNCmNvdW50cnlfbGlmZV9leHBlY3RhbmN5IHw+IA0KICBmaWx0ZXIoTGlmZV9FeHBlY3RhbmN5ID49IDgwKSB8PiANCiAgYXJyYW5nZShZZWFyKSB8PiANCiAgc2xpY2UoMToxMCkgDQogIA0KDQpgYGANCg0KDQpgYGB7cn0NCiMgY291bnRyeV9saWZlX2V4cGVjdGFuY3kgIHw+IA0KIyAgIGZpbHRlcihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihMaWZlX0V4cGVjdGFuY3kpKSA+PSA4MCkgfD4gDQojICAgYXJyYW5nZShZZWFyKQ0KYGBgDQoNCjIwLiBNZXJnZSBnZHBfZGYgYW5kIGxpZmVfZXhwZWN0YW5jeSwga2VlcGluZyBhbGwgY291bnRyaWVzIGFuZCB5ZWFycyB0aGF0IGFwcGVhciBpbiBib3RoIHRpYmJsZXMuIFNhdmUgdGhlIHJlc3VsdCB0byBhIG5ldyB0aWJibGUgbmFtZWQgZ2RwX2xlLiBJZiB5b3UgZ2V0IGFueSBlcnJvcnMgaW4gZG9pbmcgdGhpcywgcmVhZCB0aGVtIGNhcmVmdWxseSBhbmQgY29ycmVjdCB0aGVtLiBMb29rIGF0IHRoZSBmaXJzdCBmaXZlIHJvd3Mgb2YgeW91ciBuZXcgZGF0YSBmcmFtZSB0byBjb25maXJtIGl0IG1lcmdlZCBjb3JyZWN0bHkuIEFsc28sIGNoZWNrIHRoZSBsYXN0IGZpdmUgcm93cyB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgY2xlYW4gYW5kIGFzIGV4cGVjdGVkLg0KDQpgYGB7cn0NCg0KZ2RwX2xlIDwtIG1lcmdlKGdkcF9kZiwgY291bnRyeV9saWZlX2V4cGVjdGFuY3ksIGJ5PWMoIkNvdW50cnkiLCAiWWVhciIpKQ0KaGVhZChnZHBfbGUpDQp0YWlsKGdkcF9sZSkNCg0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpnZHBfbGUgfD4gDQogIGZpbHRlcihDb3VudHJ5PT0iVW5pdGVkIEtpbmdkb20iKQ0KDQpgYGANCg0KDQoyMS4gQ3JlYXRlIGEgbmV3IHRpYmJsZSwgbmFtZWQgZ2RwX2xlXzIwMjEgYnkgZXh0cmFjdGluZyBkYXRhIGZvciB0aGUgeWVhciAyMDIxIGZyb20gZ2RwX2xlLiBIb3cgbWFueSBjb3VudHJpZXMgaGF2ZSBhIGxpZmUgZXhwZWN0YW5jeSBvZiBhdCBsZWFzdCA4MCBpbiAyMDIxPw0KDQpgYGB7cn0NCg0KZ2RwX2xlXzIwMjEgPC0gZ2RwX2xlIHw+IA0KICBmaWx0ZXIoWWVhciA9PSAiMjAyMSIpDQojIA0KZ2RwX2xlXzIwMjENCg0KYGBgDQoNCkhvdyBtYW55IGNvdW50cmllcyBoYXZlIGEgbGlmZSBleHBlY3RhbmN5IG9mIGF0IGxlYXN0IDgwIGluIDIwMjE/DQoNCmBgYHtyfQ0KDQpnZHBfbGVfMjAyMSB8PiANCiAgZmlsdGVyKExpZmVfRXhwZWN0YW5jeSA+PSA4MCkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGVuZ3RoKHdoaWNoKGdkcF9sZV8yMDIxJExpZmVfRXhwZWN0YW5jeSA+PSA4MCkpDQoNCmBgYA0KDQoyMi4gRmluZCB0aGUgY291bnRyaWVzIHRoYXQgaGFkIHRoZSB0b3AgMyBsYXJnZXN0IEdEUCBwZXIgY2FwaXRhIGZpZ3VyZXMgZm9yIDIwMjEuIENyZWF0ZSBhIHBsb3Qgc2hvd2luZyB0aGUgY2hhbmdlIGluIGxpZmUgZXhwZWN0YW5jeSBvdmVyIHRpbWUgZm9yIHRoZXNlIHRocmVlIGNvdW50cmllcy4gVGhpcyBwbG90IHNob3VsZCBiZSBmYWNldGVkIHNvIHRoYXQgZWFjaCBjb3VudHJ5IGlzIGNvbnRhaW5lZCBpbiBpdHMgb3duIGZpZ3VyZS4NCg0KYGBge3J9DQoNCmdkcF9sZV8yMDIxIHw+IA0KICBhcnJhbmdlKGRlc2MoR0RQX1Blcl9DYXBpdGEpKSB8PiANCiAgc2xpY2UoMTozKSANCg0KYGBgDQpDcmVhdGUgYSBwbG90IHNob3dpbmcgdGhlIGNoYW5nZSBpbiBsaWZlIGV4cGVjdGFuY3kgb3ZlciB0aW1lIGZvciB0aGVzZSB0aHJlZSBjb3VudHJpZXMuIFRoaXMgcGxvdCBzaG91bGQgYmUgZmFjZXRlZCBzbyB0aGF0IGVhY2ggY291bnRyeSBpcyBjb250YWluZWQgaW4gaXRzIG93biBmaWd1cmUuDQpgYGB7cn0NCmxpZmVfZXhwX2ZhY2V0IDwtIGNvdW50cnlfbGlmZV9leHBlY3RhbmN5IHw+IA0KICBmaWx0ZXIoQ291bnRyeSA9PSBjKCJMdXhlbWJvdXJnIiwgIlNpbmdhcG9yZSIsICJJcmVsYW5kIikpDQoNCmBgYA0KDQpgYGB7cn0NCiMgDQojIGdncGxvdChsaWZlX2V4cF9mYWNldCwgYWVzKHggPSBZZWFyLCB5ID0gTGlmZV9FeHBlY3RhbmN5LCBjb2xvciA9IENvdW50cnkpKSArDQojICAgZ2VvbV9saW5lKCkgKw0KIyAgIGxhYnModGl0bGUgPSAiTGlmZSBFeHBlY3RhbmN5IG92ZXIgdGltZSIsDQojICAgICAgICB5ID0gIkxpZmUgRXhwZWN0YW5jeSIsDQojICAgICAgICBjb2xvciA9ICJDb3VudHJ5IikgKw0KIyAgIGZhY2V0X2dyaWQoLiB+IENvdW50cnkpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQojIGdncGxvdChkYXRhID0gbGlmZV9leHBfZmFjZXQsIGFlcyh4ID0gWWVhciwgeSA9IExpZmVfRXhwZWN0YW5jeSkpICsNCiMgICBnZW9tX2xpbmUoY29sb3IgPSAic3RlZWxibHVlIikgKw0KIyAgIGxhYnModGl0bGUgPSAiTGlmZSBFeHBlY3RhbmN5IE92ZXIgVGltZSIsDQojICAgICAgICB4ID0gIlllYXIiLA0KIyAgICAgICAgeSA9ICJMaWZlIEV4cGVjdGFuY3kiKSArDQojICAgZmFjZXRfd3JhcCh+IENvdW50cnksIG5jb2wgPSAzKSArDQojICAgdGhlbWVfYncoKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KbGlmZV9leHBfZmFjZXQgfD4gDQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PUxpZmVfRXhwZWN0YW5jeSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhDb3VudHJ5KSkNCmBgYA0KDQoyMy4gQ3JlYXRlIGEgc2NhdHRlciBwbG90IG9mIExpZmUgRXhwZWN0YW5jeSB2cyBHRFAgcGVyIENhcGl0YSBmb3IgdGhlIHllYXIgMjAyMS4gV2hhdCBkbyB5b3Ugbm90aWNlPw0KSSBub3RpY2UgdGhhdCBpdCBhcHBlYXJzIHRvIGhhdmUgYSBjdXJ2ZWQgYW5kIHBvc2l0aXZlIHJlbGF0aW9uc2hpcC4NCg0KYGBge3J9DQoNCmlucHV0IDwtIGdkcF9sZV8yMDIxWywgYygiTGlmZV9FeHBlY3RhbmN5IiwgIkdEUF9QZXJfQ2FwaXRhIildDQoNCnBsb3QoeCA9IGlucHV0JExpZmVfRXhwZWN0YW5jeSwgeSA9IGlucHV0JEdEUF9QZXJfQ2FwaXRhLA0KICAgIHhsYWIgPSAiTGlmZSBFeHBlY3RhbmN5IiwNCiAgICB5bGFiID0gIkdEUCBQZXIgQ2FwaXRhIiwNCiAgICBtYWluID0gIldlaWdodCB2cyBNaWxhZ2UiDQopDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQojIGdncGxvdChnZHBfbGVfMjAyMSwgYWVzKHggPSAiTGlmZV9FeHBlY3RhbmN5IiwgeSA9ICJHRFBfUGVyX0NhcGl0YSIpKSArDQojICAgICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBmYWN0b3IoQ29udGluZW50KSkpDQoNCmBgYA0KDQoyNC4gRmluZCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBMaWZlIEV4cGVjdGFuY3kgYW5kIEdEUCBwZXIgQ2FwaXRhIGZvciB0aGUgeWVhciAyMDIxLiBXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoaXMgbnVtYmVyPw0KDQpgYGB7cn0NCmdkcF9sZV8yMDIxX2Ryb3BwZWQgPC0gZ2RwX2xlXzIwMjEgIHw+IA0KICBmaWx0ZXIoIWlzLm5hKExpZmVfRXhwZWN0YW5jeSkgJiAhaXMubmEoR0RQX1Blcl9DYXBpdGEpKQ0KYGBgDQoNCg0KYGBge3J9DQoNCmNvcihnZHBfbGVfMjAyMV9kcm9wcGVkJExpZmVfRXhwZWN0YW5jeSwgZ2RwX2xlXzIwMjFfZHJvcHBlZCRHRFBfUGVyX0NhcGl0YSwgbWV0aG9kID0gInBlYXJzb24iKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQpgYGB7cn0NCmBgYA0KDQpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouDQoNCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ3RybCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLg0KDQpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuDQo=